﻿namespace K3Cloud.WebApi.Core.IoC.Types
{
    /// <summary>
    /// Refasync 用于异步方法中模拟ref/out参数的包装类型。
    /// 适用于Task/async场景下需要返回多个结果或引用传递的场合。
    /// </summary>
    /// <typeparam name="T">包装的值类型</typeparam>
    public class Refasync<T>
    {
        /// <summary>
        /// 默认构造函数。
        /// </summary>
        public Refasync() { }

        /// <summary>
        /// 通过初始值构造。
        /// </summary>
        /// <param name="value">初始值</param>
        public Refasync(T? value) { Value = value; }

        /// <summary>
        /// 被包装的值。
        /// </summary>
        public T? Value { get; set; }

        /// <summary>
        /// 返回值的字符串表示。
        /// </summary>
        /// <returns>值的字符串</returns>
        public override string? ToString()
        {
            T? value = Value;
            return value == null ? "" : value.ToString();
        }

        /// <summary>
        /// 隐式转换为T类型。
        /// </summary>
        public static implicit operator T?(Refasync<T?> r) { return r.Value; }

        /// <summary>
        /// 隐式转换为Refasync类型。
        /// </summary>
        public static implicit operator Refasync<T>(T value) { return new Refasync<T>(value); }
    }
}